package com.qdlc.p2p.biz.service;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.common.model.jpa.QueryParam;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.dto.UserIdentify;
import com.qdlc.p2p.dal.model.BorrowModel;
import com.qdlc.p2p.dal.model.UserModel;

/**
 * 用户Service
 *
 * @author xx
 * @version 2.0
 * @since 2014年3月26日
 */
public interface UserService {

	/**
	 * App用户登录
	 *
	 * @param userName
	 * @param pwd
	 * @return
	 */
	User loginForApp(String userName, String pwd);

	/**
	 * 根据userId获取user
	 *
	 * @param userId 用户ID
	 * @return User实体类
	 */
	User find(long userId);

	/**
	 * 根据tppId获取user
	 *
	 * @param userId 用户ID
	 * @return User实体类
	 */
	User findByTppId(String tppId);

	/**
	 * 统计注册数量
	 *
	 * @return 注册数量
	 */
	int count(QueryParam param);

	/**
	 * 根据用户名计数
	 *
	 * @param username 用户名
	 * @return 计数
	 */
	int countByUserName(String username);

	/**
	 * 根据用户名获取用户
	 *
	 * @param username 用户名
	 * @return User实体类
	 */
	User getUserByUserName(String username);

	/**
	 * 根据身份证计数
	 *
	 * @param cardId 身份证
	 * @return 计数
	 */
	int countByCardId(String cardId);

	/**
	 * 根据手机计数
	 *
	 * @param mobilePhone 手机
	 * @return 计数
	 */
	int countByMobilePhone(String mobilePhone);

	/**
	 * 根据邮箱计数
	 *
	 * @param email 邮箱
	 * @return 计数
	 */
	int countByEmail(String email);

	/**
	 * 根据邮箱获取用户
	 *
	 * @param email 邮箱
	 * @return User实体类
	 */
	User getUserByEmail(String email);

	/**
	 * 根据手机号获取用户
	 *
	 * @param mobilePhone 手机号
	 * @return User实体类
	 */
	User getUserByMobilePhone(String mobilePhone);

	/**
	 * 注册
	 *
	 * @param model User实体类
	 * @return User实体类
	 */
	User doRegister(UserModel model);

	/**
	 * 注册
	 *
	 * @param model User实体类
	 * @param partnerFlg 合作者标志
	 * @return User实体类
	 */
	User doRegister(UserModel model, boolean partnerFlg);

	/**
	 * 注册-激活邮箱
	 *
	 * @param idstr ID
	 * @return User实体类
	 * @throws Exception 异常
	 */
	User activationEmail(String idstr) throws Exception;

	/**
	 * 修改用户密码
	 *
	 * @param user User实体类
	 * @return User User实体类
	 */
	User modifyPwd(User user);

	/**
	 * 修改用户交易密码
	 *
	 * @param user User实体类
	 * @return User User实体类
	 */
	User modifyPaypwd(User user);

	/**
	 * 找回密码-通过邮箱找回-第1步
	 *
	 * @param request HttpServletRequest
	 * @param userName 用户名
	 * @param email 邮箱
	 * @return User实体类
	 */
	User getPwdByEmailStep1(HttpServletRequest request, String userName, String email);

	/**
	 * 获得用户清单列表
	 *
	 * @param pageNumber
	 * @param pageSize
	 * @param model
	 * @return
	 */
	PageDataList<UserModel> userList(int pageNumber, int pageSize, UserModel model);

	/**
	 * 获取担保公司
	 *
	 * @return 担保公司列表
	 */
	List<User> getVouchFirms();

	/**
	 * 查找已开通第三方支付的企业账户Email集合
	 *
	 * @return
	 */
	PageDataList<User> findUserList(BorrowModel model);

	/**
	 * 根据登录名查找用户
	 *
	 * @param username
	 * @return
	 */
	User getUserByInfo(String username);

	/**
	 * 根据ID查找用户
	 *
	 * @param userId
	 * @return
	 */
	User getUserById(long userId);

	/**
	 * 修改用户
	 *
	 * @param user
	 */
	void update(User user);

	/**
	 * 第三方开开户业务处理
	 */
	void tppchinapnrRegis(long userId, String tppUserId, String tppUserCustId, String cardId, String realName);

	/**
	 * 保存User
	 *
	 * @param user
	 * @return
	 */
	User save(User user);

	/**
	 * 企业开户成功业务处理
	 */
	void tppAuditMemberInfosSuccess(String auditOrderNo, String innerOrderNo, byte auditStatus, String auditMessage);

	/**
	 * 企业开户失败业务处理
	 */
	void tppAuditMemberInfosFail(String auditOrderNo, String innerOrderNo, byte auditStatus, String auditMessage);

	/**
	 * 获取当前session中的用户信息
	 *
	 * @param sessionUserIdentify
	 * @return
	 */
	User getCurrentSessionUser(UserIdentify sessionUserIdentify);

	/**
	 * 获取当前session中的用户信息（JSON请求时使用）
	 *
	 * @param sessionUserIdentify
	 * @return
	 */
	User getCurrentSessionUser4Json(UserIdentify sessionUserIdentify);

	/**
	 * 分文件输出excel
	 *
	 * @param start
	 * @param itemCount
	 * @param model
	 * @return
	 */
	List<UserModel> userListForExcel(int start, int itemCount, UserModel model);

	int getCountByUserCondition(UserModel model);

	/**
	 * 根据时间获取注册总数
	 * @param date
	 */
	int getRegisterCountByDate(String date);
}
